//
//  ViewController.m
//  UI-GCD
//
//  Created by 冀永金 on 16/8/18.
//  Copyright © 2016年 冀永金. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *image;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.GCD Grand (伟大的) Ceteral (中央的)  DisPatch (调度)
    // 2.GCD的核心概念 队列 任务拆分分配到队列中，系统会自动为我们创建线程和调度线程，自动
    // 3.GCD中的队列要严格遵循FIFO（先进先出）原则
    // 分类
    // 串行
    // 并发
    //4.队列的创建
    // 1.队列的名字
    // 2。队列类型
    dispatch_queue_t serialQueue = dispatch_queue_create("setialQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    // 主队列， 串行
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    //全局队列  参数一：调度队列优先级
    // 参数2：给未来使用  占位使用 填0
    dispatch_queue_t globalQueue =  dispatch_get_global_queue(0, 0);
    // 5.同步  异步
    // 同步  在当前线程执行任务，不能开辟线程
    // 异步  在新的线程执行任务  ,能开辟线程
    // 同步串行 串行队列 不会创建线程
    //[self syncSetialQueue:serialQueue];
        //同步并发队列
    //[self syncConcurrentQueue:concurrentQueue];
        // 同步主线程队列
    // 主线程同步主线程
    // 主线程等待主线程操作结束 同步操作在主线程执行 互相等待  导致程序卡死
//        for (int i = 0; i < 10; i++) {
    //    dispatch_sync(mainQueue, ^{
//            NSLog(@"%d----%@",i, [NSThread currentThread]);
    //    });
//        }
//
   // [self syncGlobalQueue:globalQueue];
     //术语：
    // 串行：一个任务执行完毕，在执行下一个
    // 并发： 多个任务同时执行
    // 异步串行 创建一条新的线程 在该线程执行任务
   // [self asyncSerialQueue:serialQueue];
    // 异步并发 根据任务决定需要多少线程
    [self asyncConCurrentQueue:concurrentQueue];
    // 异步主线成队列
    
    // 异步全局队列
    
    [self ayncGloalQueue:globalQueue];
    //创建队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 2.创建组
    dispatch_group_t group = dispatch_group_create();
    // 往组里面的队列添加新任务（注意：在执行notify之前）
    dispatch_group_async(group, queue, ^{
        NSLog(@"这是第一个任务线程是%@----- ：%d",[NSThread currentThread],[NSThread currentThread].isMainThread);
    });
    dispatch_group_notify(group, queue, ^{
        NSLog(@"我是最后一个任务，里面的其他任务都执行完成之后，我就会会执行");
    });
    
    // Do any additional setup after loading the view, typically from a nib.
}
- (void)syncSetialQueue:(dispatch_queue_t)serialQueue {
        for (int i = 0; i < 10; i++) {
            dispatch_sync(serialQueue, ^{
            NSLog(@"同步串行队列%d----%@",i, [NSThread currentThread]);
            });
        }

}
- (void)syncConcurrentQueue:(dispatch_queue_t)setialQueue1 {
        for (int i = 0; i < 10; i++) {
            dispatch_sync(setialQueue1, ^{
            NSLog(@"同步并发队列%d----%@",i, [NSThread currentThread]);
            });
        }
    

}
- (void) syncGlobalQueue:(dispatch_queue_t)globalQueue {
    for (int i = 0; i < 10; i++) {
    dispatch_sync(globalQueue, ^{
            NSLog(@"同步全局队列%d----%@",i, [NSThread currentThread]);
    });
        
    }
    

}
- (void)asyncSerialQueue:(dispatch_queue_t)serialQueue {
    for (int i = 0; i < 10; i++) {
    dispatch_async(serialQueue, ^{
            NSLog(@"异步串行队列%d----%@",i, [NSThread currentThread]);
    });
        
    }

}
- (void)asyncConCurrentQueue:(dispatch_queue_t)concurrentQueue {
    for (int i = 0; i < 10; i++) {
    dispatch_async(concurrentQueue, ^{
            NSLog(@"异步并发队列%d----%@",i, [NSThread currentThread]);
    });
        
    }

}
- (void)ayncGloalQueue:(dispatch_queue_t)globalQueue {
    for (int i = 0; i < 10; i++) {
    dispatch_async(globalQueue, ^{
            NSLog(@"异步全局队列%d----%@",i, [NSThread currentThread]);
    });
        
    }
    

}
- (IBAction)downLoadImage:(id)sender {
       dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_async(queue, ^{
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://cdn.duitang.com/uploads/blog/201602/19/20160219211647_TPaUr.jpeg"]];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.image.image = [UIImage imageWithData:data];
        });

    });
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
